/******************************************************************************
 * Copyright (C) 2017 Chengdu Dlhd information industry co. LTD.
 * All Rights Reserved.
 * 本软件为成都顶联互动信息产业有限公司开发研制。未经本公司正式书面同意，其他任何个人、团体不得使用、复制、修改或发布本软件.
 *****************************************************************************/
package net.dgg.dggcloud.service.iboss.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;


public class ReflectParseUtil {

    /**
     * oldObj --> newObj
     * 将源oldObj对象不为null的值 赋值给需要返回的newObj对象中对于的属性 （参数必须两个对象是同类型）
     *
     * @param newObj 获取的目标对象（需要返回的对象）
     * @param oldObj 源对象
     * @return
     */
    public static Object copyPropertyIsNotNull(Object newObj, Object oldObj, String... propertys) {
        if (newObj == null || oldObj == null) {
            return null;
        }
        if (!newObj.getClass().getName().equals(oldObj.getClass().getName())) {
            return null;
        }
        Map<String, Object> pMap = new HashMap<String, Object>();
        for (String property : propertys) {//封装不需要copy的属性
            pMap.put(property, property);
        }

        Field field = null;
        String propertyName = null;
        Object value = null;
        Method method = null;
        Field[] oldFields = oldObj.getClass().getDeclaredFields();
        try {
            for (Field fid : oldFields) {
                try {
                    propertyName = fid.getName().substring(0, 1).toUpperCase() + fid.getName().substring(1);
                    method = oldObj.getClass().getMethod("get" + propertyName);
                    value = method.invoke(oldObj);
                } catch (Exception e) {
                    continue;
                }
                if (value == null || "".equals(value.toString())) {//为null的值 不用赋值
                    continue;
                }
                if (pMap.get(fid.getName()) != null) {//存在 不需要赋值的属性
                    continue;
                }
                method = newObj.getClass().getMethod("set" + propertyName, fid.getType());
                method.invoke(newObj, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return newObj;
    }
}
